package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"learn_grpc/3_stream_grpc_test/proto"
	"log"
	"sync"
	"time"
)

func main() {
	//拨号发起连接
	conn, err := grpc.Dial("localhost:50052", grpc.WithTransportCredentials(insecure.NewCredentials()))
	//conn,err := grpc.NewClient("localhost:9090")
	defer conn.Close()
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}

	// 采用封装的连接方法创建客户端
	client1 := proto.NewGreeterClient(conn)
	/*
		一、服务端流模式
	*/
	// 服务端采用send()，客户端采用GetStream()方法
	res, err := client1.GetStream(context.Background(), &proto.StreamReqData{Data: "jiang"})
	if err != nil {
		return
	}
	for {
		//由于是服务端流模式，不需要服务端return就可以收到数据，只有服务端发送了
		msg, err := res.Recv()
		if err != nil {
			fmt.Println("err:", err)
			break
		}
		fmt.Println(msg.Data)
	}
	/*
		二、客户端端流模式
	*/
	putS, err := client1.PutStream(context.Background())
	if err != nil {
		panic(err)
	}
	i := 0
	for {
		i++
		// 调用发送函数
		putS.Send(&proto.StreamReqData{Data: fmt.Sprintf("grpc-%d", i)})
		if i > 10 {
			break
		}
		time.Sleep(time.Second)
	}
	/*
		三、双向流流模式
	*/
	wg2 := sync.WaitGroup{}
	wg2.Add(2)
	allstr, err2 := client1.AllStream(context.Background())
	if err2 != nil {
		panic(err2)
	}
	// 客户端发送
	go func() {
		defer wg2.Done()
		i := 0
		for {
			i++
			err := allstr.Send(&proto.StreamReqData{Data: fmt.Sprintf("服务端你好-%d", i)})
			if err != nil {
				return
			}
			time.Sleep(time.Second)
		}
	}()

	//客户端接收
	go func() {
		defer wg2.Done()
		for {
			msg, err := allstr.Recv()
			if err != nil {
				fmt.Println("err:", err)
				break
			}
			fmt.Println("接收到server data :", msg.Data)
		}
	}()
	wg2.Wait()
}
